package com.libl.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**创建对象工厂
 * 实现步骤：
 * 1，通过静态代码块加载和解析属性文件，创建对象，并把所有对象都存储到容器中
 *    创建对象：反射技术
 *    容器：Map集合，以属性文件的key作为Map的key，以创建的对象作为Map的value
 * 2，提供一个getBean方法，根据key获取需要的对象
 *
 */
public class BeanFactory {
    //创建仓库，用Map集合
    private static final Map<String,Object> beans = new HashMap<>();

    //静态代码块，只在类加载时加载一次
    static {
        try {
            //通过类加载器获取属性文件的流对象,类加载器的位置是在根目录src下
            InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("beans.properties");
            //创建属性文件对象，加载流
            Properties properties = new Properties();
            properties.load(inputStream);
            //System.out.println(properties);

            //遍历属性对象
            //获取属性中所有的key，返回的是枚举类型
            Enumeration<?> enumeration = properties.propertyNames();
            //hasMoreElements()判断是否存在更多元素
            while (enumeration.hasMoreElements()){
                //获取下一个元素（游标是在第一个元素前面开始判断）
                String key = (String)enumeration.nextElement();
                //System.out.println(key);//返回值 userDao  userService
                String className = properties.getProperty(key);
                //System.out.println(className);//返回值 com.libl.dao.impl.UserDaoImpl   com.libl.service.impl.UserServiceImpl

                //根据字符串全名称获取类对象（class）
                Class<?> clazz = Class.forName(className);
                //使用反射机制通过类创建对象
                Object obj = clazz.newInstance();

                //把对象添加到容器中
                beans.put(key,obj);

            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("属性对象加载流失败");
        }
    }

    //从容器中获取对象的方法
    public static Object getBean(String key){
        return beans.get(key);
    }

    public static void main(String[] args) {
        Object userDao = BeanFactory.getBean("userDao");
        Object userService = BeanFactory.getBean("userService");

        System.out.println(userDao);
        System.out.println(userService);
    }

}
